package br.com.ucb.invista.dao;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

import br.com.ucb.invista.connection.EntityManagerFactory;
import br.com.ucb.invista.domain.Pessoa;

public class PessoaDao implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private EntityManager entityManager;
	private Pessoa pessoa;
	private List<Pessoa> listarPessoas;
	
	@SuppressWarnings("unchecked")
	public PessoaDao() {
		this.entityManager = EntityManagerFactory.getEntityManager();
		this.pessoa = new Pessoa();
		this.listarPessoas = entityManager.createQuery("FROM Pessoa order by nome").getResultList();
	}
	
	public Boolean salvar(Pessoa pessoa) {
		try {
			this.entityManager.getTransaction().begin();
				this.entityManager.persist(pessoa);
					this.entityManager.getTransaction().commit();
					String mensagemSucesso = "O registro foi Persistido com Sucesso!";
					FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagemSucesso, "");
					FacesContext.getCurrentInstance().addMessage(null, mensagem);
						return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Persistir a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}
	
	public Boolean alterar(Pessoa pessoa) {
		try {
			this.entityManager.getTransaction().begin();	
				this.entityManager.merge(pessoa);
					this.entityManager.getTransaction().commit();
						return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Alterar a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}
	
	public Boolean excluir(Pessoa pessoa) {
		try {	
			this.entityManager.getTransaction().begin();
				this.entityManager.remove(pessoa);
					this.entityManager.getTransaction().commit();
					String mensagemSucesso = "O registro foi Excluido com Sucesso!";
					FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagemSucesso, "");
					FacesContext.getCurrentInstance().addMessage(null, mensagem);
						return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Excluir a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}
	
	public Pessoa pesquisarCodigo(Long codigo) {
		return this.entityManager.find(Pessoa.class, codigo);
	}

	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public List<Pessoa> getListarPessoas() {
		return listarPessoas;
	}

	public void setListarPessoas(
			List<Pessoa> listarPessoas) {
		this.listarPessoas = listarPessoas;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
}
